package top.i89ck.modules.admin;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.core.Path;
import com.jfinal.core.paragetter.Para;
import org.opensource.jfhelper.utils.Ret;
import com.jfinal.plugin.activerecord.Page;
import top.i89ck.common.jqgrid.JqPager;
import top.i89ck.common.jqgrid.PageMode;
import top.i89ck.common.jqgrid.View;
import top.i89ck.common.utils.Const;
import top.i89ck.modules.model.Role;
import top.i89ck.modules.model.User;
import top.i89ck.modules.service.RoleService;
import top.i89ck.modules.utils.Pager;
import top.i89ck.modules.utils.Subject;

import java.util.List;
import java.util.Map;

/**
 * 用于角色的控制操作Controller类。 实现角色的相关操作
 *
 * @author Seiya
 */
@Path(value = "admin/role", viewPath = Const.BASE_PATH + "/role")
public class RoleController extends Controller {

    @Inject
    private RoleService roleService;

    /**
     * 打开角色的管理页面
     */
    @View(mode = PageMode.GridTable)
    public void index() {
    }

    /**
     * 实现角色的具体查询方法。 用于角色的查询显示
     */
    public JqPager query(@Para("") Pager pager, String roleName) {
        Page<Role> page = roleService.getPage(pager, roleName);
        return new JqPager(page);
    }

    /**
     * 新增一条系统角色数据
     */
    public void add() {
        set("role", new Role());
        render("role_edit.html");
    }

    /**
     * 修改一条系统角色
     */
    public void update(Long roleId) {
        Role role = roleService.findById(roleId);
        set("role", role);
        render("role_edit.html");
    }

    /**
     * 保存系统角色
     */
    public Ret save(@Para("") Role role) {
        boolean succeed = roleService.save(role);
        return succeed ? Ret.ok() : Ret.fail("保存失败，请重新操作");
    }

    /**
     * 删除系统中的角色数据, 需要验证角色的使用情况， 是否存在正常账号关联
     */
    public Ret delAll(String roleIds) {
        User sessionUser = Subject.getSessionUser();
        boolean succeed = roleService.delAll(StrUtil.splitTrim(roleIds, ","), sessionUser);
        return succeed ? Ret.ok() : Ret.fail("删除失败，请重新操作");
    }

    /**
     * 打开角色权限是设置界面， 提供设置的信息
     */
    public void setting(Long roleId) {
        List<Map<String, Object>> list = roleService.getZtreeOptionsByRoleId(roleId);
        set("options", JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect));
        render("role_option.html");
    }

    /**
     * 设置角色权限的功能。 实现角色与权限的关联功能
     */
    public Ret saveRoleOptions(Long roleId, String optionIds) {
        boolean succeed = roleService.saveRoleOptions(roleId, StrUtil.splitTrim(optionIds, ","));
        return succeed ? Ret.ok() : Ret.fail("设置失败，请重新操作");
    }
}
